import jwt
import random
import datetime
from functools import wraps
from flask import request

from src.utils import response_
from app.config import Config

# 令牌黑名单存储 (实际项目中应使用Redis或数据库)
token_blacklist = set()

def revoke_token(token):
    """将token加入黑名单使其失效"""
    token_blacklist.add(token)

def is_token_revoked(token):
    """检查token是否已被撤销"""
    return token in token_blacklist


def create_token(user_id, username, role):
    """生成包含Bearer前缀的JWT令牌"""
    payload = {
        'user_id': user_id,
        'username': username,
        'role': role,
        'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=24)
    }

    # 生成纯token
    token = jwt.encode(payload, Config.SECRET_KEY, algorithm='HS256')
    return f'Bearer {token}'


def token_required(f):
    @wraps(f)
    def decorated(*args, ** kwargs):
        token = None

        # 获取token方式1：从Authorization头中获取完整token
        if 'Authorization' in request.headers:
            # 直接使用完整token字符串（包括Bearer前缀）
            auth_header = request.headers['Authorization']
            # 确保格式正确（Bearer <token>）
            if auth_header.startswith('Bearer '):
                token = auth_header

        # 获取token方式2：查询参数
        if not token and 'token' in request.args:
            token = request.args.get('token')

        if not token:
            return response_.error(message='Token不存在!', code=401)

        try:
            # 确保token有Bearer前缀
            if token.startswith('Bearer '):
                # 提取实际token部分进行解码
                actual_token = token[7:]
                data = jwt.decode(actual_token, Config.SECRET_KEY, algorithms=['HS256'])
            else:
                # 如果没有Bearer前缀，返回格式错误
                return response_.error(message='无效的令牌格式!', code=401)

            # 获取当前用户信息
            current_user = {
                'user_id': data['user_id'],
                'username': data['username'],
                'role': data['role']
            }
        except jwt.ExpiredSignatureError:
            return response_.error(message='Token已经过期!', code=401)
        except jwt.InvalidTokenError:
            return response_.error(message='无效Token!', code=401)

        return f(current_user, *args, ** kwargs)

    return decorated

def generate_number():
    # 生成第一位（1-9）
    first_digit = random.randint(1, 9)
    # 生成剩余7位（0-9）
    other_digits = ''.join(str(random.randint(0, 9)) for _ in range(7))
    return int(str(first_digit) + other_digits)